//package com.juben.svr.demos.web;
//
//import com.itextpdf.html2pdf.ConverterProperties;
//import com.itextpdf.html2pdf.HtmlConverter;
//import com.itextpdf.kernel.pdf.PdfDocument;
//import com.itextpdf.kernel.pdf.PdfWriter;
//import com.itextpdf.layout.Document;
//import com.itextpdf.layout.element.AreaBreak;
//import com.itextpdf.layout.font.FontProvider;
//import com.itextpdf.styledxmlparser.css.media.MediaDeviceDescription;
//import com.itextpdf.styledxmlparser.css.media.MediaType;
//import org.apache.commons.io.FileUtils;
//import org.apache.commons.io.IOUtils;
//import org.apache.commons.lang3.SystemUtils;
//
//import java.io.File;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.OutputStream;
//import java.nio.charset.StandardCharsets;
//import java.nio.file.Files;
//import java.util.Objects;
//import java.util.UUID;
//
//public class IText7ChineseFont {
//    private static final String outputDir = "D:\\pdfs\\pdf";
//    /**
//     * 程序的入口点。
//     * 此方法读取HTML模板文件，并使用不同的字体将其转换为PDF格式，然后保存转换后的PDF文件。
//     * @param args 命令行参数，在此程序中未使用。
//     * @throws Exception 可能抛出与文件处理和PDF生成相关的异常。
//     */
//    public static void main(String[] args) throws Exception {
//        // 确保HTML模板文件存在并获取其输入流
//        final InputStream is = Objects.requireNonNull(IText7ChineseFont.class.getResourceAsStream("/Template.html"));
//        // 读取HTML内容，并指定字符集为UTF-8以确保正确解析中文字符
//        final String html = IOUtils.toString(is, StandardCharsets.UTF_8);
//
//        // 使用阿里巴巴字体将HTML转换为PDF并保存PDF文件
//        html2pdf("alibaba", html, getAlibabaFontDirectory());
//        // 使用Source Han Sans字体将HTML转换为PDF并保存PDF文件
//        html2pdf("source sans", html, getSourceHanSansFontDirectory());
//        // 使用Source Han Serif字体将HTML转换为PDF并保存PDF文件
//        html2pdf("source serif", html, getSourceHanSerifFontDirectory());
//    }
//
//
//    /**
//     * 将HTML字符串转换为PDF文件，并支持中文字体。
//     *
//     * @param name PDF文件的名称前缀，用于标识生成的文件。
//     * @param html 要转换的HTML内容字符串。
//     * @param fontDir 字体目录的路径，用于加载中文字体。
//     * @throws Exception 如果转换过程中发生错误，则抛出异常。
//     */
//    private static void html2pdf(String name, String html, String fontDir) throws Exception {
//        // 指定PDF文件保存的文件夹路径
//        final File outputFolder = new File(outputDir);
//        // 确保输出文件夹存在
//        if (!outputFolder.exists() && !outputFolder.mkdirs()) {
//            throw new IOException("无法创建输出文件夹: " + outputDir);
//        }
//        // 创建一个指定路径下的文件，用于存储生成的PDF
//        final File file = new File(outputFolder, "itext-chinese-font-" + System.currentTimeMillis() + ".pdf");
//        // 初始化转换属性
//        final ConverterProperties properties = new ConverterProperties();
//        // 初始化字体提供者，并加载指定目录下的字体
//        final FontProvider fontProvider = new FontProvider();
//        fontProvider.addDirectory(fontDir);
//        properties.setFontProvider(fontProvider);
//        // 设置媒体设备描述，这里假设是打印介质
//        properties.setMediaDeviceDescription(new MediaDeviceDescription(MediaType.PRINT));
//        // 使用try-with-resources确保资源被正确关闭
//        try (final OutputStream os = Files.newOutputStream(file.toPath());
//             final PdfWriter pdfWriter = new PdfWriter(os);
//             final PdfDocument pdfDocument = new PdfDocument(pdfWriter)) {
//            // 转换HTML字符串为PDF文档
//            try (final Document doc = HtmlConverter.convertToDocument(html, pdfDocument, properties)) {
//                // 添加一个区域断页，确保内容在新的页面开始
//                doc.add(new AreaBreak());
//            }
//        }
//        // 输出文件的绝对路径，以便于调试和确认文件位置
//        System.out.println(name + ": " + file.getAbsolutePath());
//    }
//
//    /**
//     * 获取用于存储阿里巴巴字体文件的目录
//     * 这个方法在系统临时目录下创建一个唯一目录，并从类路径资源中复制阿里巴巴字体文件到该目录
//     * 如果目录创建失败或字体文件无法复制，则抛出异常
//     *
//     * @return 存储阿里巴巴字体文件的目录路径
//     * @throws IOException 如果字体文件无法复制到目录中，则抛出此异常
//     */
//    private static String getAlibabaFontDirectory() throws IOException {
//        // 创建一个唯一的目录路径，用于存放字体文件
//        final File fontDir = new File(SystemUtils.getJavaIoTmpDir(), UUID.randomUUID().toString());
//        // 如果目录不存在且无法创建，则抛出异常
//        if (!fontDir.exists() && !fontDir.mkdirs()) {
//            throw new IllegalStateException();
//        }
//        //从类路径资源中加载轻量级字体文件
//        final InputStream fontLight = Objects.requireNonNull(IText7ChineseFont.class.getResourceAsStream("/fonts/AlibabaPuHuiTi-2-45-Light.ttf"));
//        // 从类路径资源中加载粗体字体文件
//        final InputStream fontBold = Objects.requireNonNull(IText7ChineseFont.class.getResourceAsStream("/fonts/AlibabaPuHuiTi-2-85-Bold.ttf"));
//        // 将字体文件复制到创建的目录中
//        IOUtils.copy(fontLight, Files.newOutputStream(new File(fontDir, "AlibabaPuHuiTi-2-45-Light.ttf").toPath()));
//        IOUtils.copy(fontBold, Files.newOutputStream(new File(fontDir, "AlibabaPuHuiTi-2-85-Bold.ttf").toPath()));
//
//        // 注册一个关闭钩子，在JVM关闭时删除创建的目录及其内容
//        Runtime.getRuntime().addShutdownHook(new Thread(() -> FileUtils.deleteQuietly(fontDir)));
//        // 返回存储字体文件的目录的绝对路径
//        return fontDir.getAbsolutePath();
//    }
//    /**
//     * 获取SourceHanSans字体目录
//     *
//     * @return 字体目录的绝对路径
//     * @throws IOException 如果无法访问字体资源文件
//     * 此方法负责创建一个临时目录，并在其中存放必要的字体文件
//     * 它确保了字体文件被正确地从资源中提取并设置在该目录下
//     */
//    private static String getSourceHanSansFontDirectory() throws IOException {
//        // 创建一个唯一的临时目录来存放字体文件
//        final File fontDir = new File(SystemUtils.getJavaIoTmpDir(), UUID.randomUUID().toString());
//        // 如果目录不存在且无法创建，则抛出异常
//        if (!fontDir.exists() && !fontDir.mkdirs()) {
//            throw new IllegalStateException();
//        }
//        // 从资源中获取字体文件输入流，字体重量分别为Light和Bold
//        final InputStream fontLight = Objects.requireNonNull(IText7ChineseFont.class.getResourceAsStream("/fonts/SourceHanSansSC-ExtraLight.otf"));
//        final InputStream fontBold = Objects.requireNonNull(IText7ChineseFont.class.getResourceAsStream("/fonts/SourceHanSansSC-Medium.otf"));
//        // 将字体文件复制到临时目录中
//        IOUtils.copy(fontLight, Files.newOutputStream(new File(fontDir, "SourceHanSansSC-ExtraLight.otf").toPath()));
//        IOUtils.copy(fontBold, Files.newOutputStream(new File(fontDir, "SourceHanSansSC-Medium.otf").toPath()));
//
//        // 注册一个关闭钩子，在JVM关闭时删除临时目录
//        Runtime.getRuntime().addShutdownHook(new Thread(() -> FileUtils.deleteQuietly(fontDir)));
//        // 返回临时目录的绝对路径
//        return fontDir.getAbsolutePath();
//    }
//    /**
//     * 获取SourceHanSerif字体目录
//     *
//     * 本方法尝试创建一个临时目录，并将必要的字体文件复制到该目录
//     * 如果目录创建失败或者字体文件复制失败，将抛出异常
//     * 在程序退出时，通过关闭钩子删除该临时目录
//     *
//     * @return 字体目录的绝对路径
//     * @throws IOException 如果字体文件复制失败或目录创建失败
//     */
//    private static String getSourceHanSerifFontDirectory() throws IOException {
//        // 创建一个位于系统临时目录下的唯一目录，用于存放字体文件
//        final File fontDir = new File(SystemUtils.getJavaIoTmpDir(), UUID.randomUUID().toString());
//        // 如果目录不存在且创建目录失败，则抛出异常
//        if (!fontDir.exists() && !fontDir.mkdirs()) {
//            throw new IllegalStateException();
//        }
//        // 从类路径资源中加载字体文件
//        final InputStream fontLight = Objects.requireNonNull(IText7ChineseFont.class.getResourceAsStream("/fonts/SourceHanSerifSC-ExtraLight.otf"));
//        final InputStream fontBold = Objects.requireNonNull(IText7ChineseFont.class.getResourceAsStream("/fonts/SourceHanSerifSC-Medium.otf"));
//        // 将字体文件复制到临时目录中
//        IOUtils.copy(fontLight, Files.newOutputStream(new File(fontDir, "SourceHanSerifSC-ExtraLight.otf").toPath()));
//        IOUtils.copy(fontBold, Files.newOutputStream(new File(fontDir, "SourceHanSerifSC-Medium.otf").toPath()));
//
//        // 注册关闭钩子，在程序退出时删除临时目录
//        Runtime.getRuntime().addShutdownHook(new Thread(() -> FileUtils.deleteQuietly(fontDir)));
//        // 返回字体目录的绝对路径
//        return fontDir.getAbsolutePath();
//    }
//}
